/**
 * @brief XML配置文件与命令行参数头文件
 * @author zhangpeihao
 */

#include <zsystem/core/xml/xmlFile.h>
#include <zsystem/core/xml/xmlGetOpt.h>

#pragma once


namespace zsystem {
	/**
	 * @brief XML配置文件与命令行参数类
	 */
  class xmlConfig : public xmlFile {
	public:
		/**
		 * @brief 构造函数
		 */
		xmlConfig()
    :xmlFile()
		{
		}

		///析构函数
		virtual ~xmlConfig(){
		}

    /**
		 * @brief 打开文件
		 * @param[in] filePath 默认配置文件，如果命令行中没有-config参数则使用配置文件
		 * @param[in] opt命令行解析
		 * @return 成功或失败
		 */
    const Z_BOOL open(const char* filePath, xmlGetOpt* opt = Z_NULL);

		/**
		 * @brief 读取配置项
     * @param[in] namePath 配置名
		 * @param[in,out] value 数值
		 * @param[in] parent 父节点(默认为root)
		 * @return 成功或失败
		 */
    template<typename TYPE>
    const Z_BOOL readConfig(const char* namePath, TYPE& value, const xmlNode parent = Z_NULL){
      xmlNode node(Z_NULL);
      if (Z_NULL == parent)
      {
        node = this->getChildNodeByPath(_doc->RootElement(), namePath);
      }
      else
      {
        node = this->getChildNodeByPath(parent, namePath);
      }
      if (Z_NULL == node)
      {
        LOG(WARNING) << "reanConfig[" << namePath << "] failed!";
        return Z_FALSE;
      }
      return this->read<TYPE>(node, value);
    }

  protected:
	};

} 
 
